{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 分类问题的评估方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_breast_cancer\n",
    "data = load_breast_cancer()\n",
    "X = data.data\n",
    "y = 1 - data.target\n",
    "# 反转标签的0和1\n",
    "\n",
    "X = X[:, :10]\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "model_lor = LogisticRegression()\n",
    "model_lor.fit(X, y)\n",
    "y_pred = model_lor.predict(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[341  16]\n",
      " [ 36 176]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "cm = confusion_matrix(y, y_pred)\n",
    "print(cm)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 正确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9086115992970123"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "accuracy_score(y, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 精确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9166666666666666"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import precision_score\n",
    "precision_score(y, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 召回率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8301886792452831"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import recall_score\n",
    "recall_score(y, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## F值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8712871287128713"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import f1_score\n",
    "f1_score(y, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 预测概率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[4.41813063e-03, 9.95581869e-01],\n",
       "       [4.87318124e-04, 9.99512682e-01],\n",
       "       [3.31064283e-04, 9.99668936e-01],\n",
       "       ...,\n",
       "       [2.62819355e-02, 9.73718064e-01],\n",
       "       [5.09374722e-06, 9.99994906e-01],\n",
       "       [9.74068776e-01, 2.59312244e-02]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_lor.predict_proba(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[259  98]\n",
      " [  2 210]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "y_pred2 = (model_lor.predict_proba(X)[:, 1]>0.1).astype(np.int)\n",
    "print(confusion_matrix(y, y_pred2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8242530755711776\n",
      "0.9905660377358491\n"
     ]
    }
   ],
   "source": [
    "print(accuracy_score(y, y_pred2))\n",
    "print(recall_score(y, y_pred2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ROC曲线与AUC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "probas = model_lor.predict_proba(X)\n",
    "fpr, tpr, thresholds = roc_curve(y, probas[:, 1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10b51f1d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "plt.style.use('fivethirtyeight')\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "fig.set_size_inches(4.8, 5)\n",
    "\n",
    "ax.step(fpr, tpr, 'gray')\n",
    "ax.fill_between(fpr, tpr, 0, color='skyblue', alpha=0.8)\n",
    "ax.set_xlabel('False Positive Rate')\n",
    "ax.set_ylabel('True Positive Rate')\n",
    "ax.set_facecolor('xkcd:white')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9767322023148881"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import roc_auc_score\n",
    "roc_auc_score(y, probas[:, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 回归问题的评估方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_boston\n",
    "data = load_boston()\n",
    "X = data.data[:, [5,]]\n",
    "y = data.target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "model_lir = LinearRegression()\n",
    "model_lir.fit(X, y)\n",
    "y_pred = model_lir.predict(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[9.10210898]\n",
      "-34.67062077643857\n"
     ]
    }
   ],
   "source": [
    "print(model_lir.coef_)\n",
    "print(model_lir.intercept_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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AwYwbtw4Lr/8cr7//nvsdjtz5syhf//+LFq0iHvuuYfi4mJKSko4++yz6d69Oy+88AINDQ2MGTOGESNGMHny5JZZUvPmzaNbt25cdNFFbN68mfLych544AG2bNnCFVdcQWFhIaNGjeKqq67i0ksv5dRTT2X06NG8/fbb/PnPf6agoIDevXtz7733UlJSwkEHHcRpp53GihUrqKmp4ZlnnmGXXXZp9X2eeuopHn30UbTWjBkzhmnTprU69tdff83kyZN55ZVXmDlzJg6Hg3fffZdDDjmEmpoabr/9drTWDB8+nNdee40VK1bwl7/8hYKCAsaMGcPUqVOTvubSFRZBVRUcd9wQy6By0kk+fvqpmjvukKAiRC779NNPmTBhAhMnTuSee+5h0KBBvPrqq9x6661Mnz4dgBtuuIGFCxfy8ssvs2nTJo455hgAli1bxh133MEJJ5zAjBkzOPnkk1myZAnnnXced911F9XV1WzevJnFixcza9YsysvLee+99zjjjDNYsmQJZ5xxRqu6VFdXc8011/Dss8+yZMkShgwZwuzZswHwer3svffeLF68mOOOO46FCxe2+uz69euZN28eS5YsYenSpfTq1Qufz7yX5P333+fFF1/kyiuv5O2336axsZHly5dz6KGHEgwGue6661iwYAGvv/46n3zyCZ999lnS11taLGE8Hjj++GI+/ND8shx8sJ9//rOeTjilXYi81Lt3bwYPHgzA6tWr2bZtG8uXLwdouTGXlpZSX1+PYRjU1NS0vD5kyBB69uyJx+Nh9erVbNq0iaeeeopgMEiPHj0oLy/nhhtuYNq0aey8885cccUVXHDBBTz88MNMnTqVE088kT59tudCff3111RUVLDDDk07xB511FFcf/31QFMy6VFHHQVAr1692Lx5c6vvsXbtWn79619TVNS0d9P48eMtv/vIkSMpKCigoKCAsWPHsmTJEl555RWmTp3KN998Q0NDA+PGjQOgtraW9evXM3To0MQudDMJLEAgABdeWMTCheZz7XfdNciKFbWUl2eoYkJ0QNkYEwnPoxk8eDBjx47l/PPPJxgM8t///heAM888k3HjxmG327n++utbEgLbfvacc85h5MiReL1eVq1aRSAQYNddd2XWrFnceeedvP766wwdOpTx48fjcDgYNWoU//73v1uOsdtuu7F+/XqqqqooLy/n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10b4e8780>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "fig, ax = plt.subplots()\n",
    "ax.scatter(X, y, color='pink', marker='s', label='data set')\n",
    "ax.plot(X, y_pred, color='blue', label='regression curve')\n",
    "ax.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 均方误差"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "43.60055177116956"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import mean_squared_error\n",
    "mean_squared_error(y, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 决定系数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.48352545599133423"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import r2_score\n",
    "r2_score(y, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 与其他算法进行比较"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import SVR\n",
    "model_svr_linear = SVR(C=0.01, kernel='linear')\n",
    "model_svr_linear.fit(X, y)\n",
    "y_svr_pred = model_svr_linear.predict(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Ggnx35RC1wgzShJM9Gk9luNiPrezOqE6ZLtk94gRIhoJLFkoEIAL7tqX55ftFbVc164BPvqols6dU7/IQcBuy/kbUSr3sRHCyOzZs/nZz37G6NGjM12VlJPAkmVufqg79zzb1bDcmjXV9OmT06vmpF02jDcIKCsz3kguHpWVuTFT65Zbbsl0FdJGAkuWePxxG9dfb5wt//77NQwZkrppm6FdW6EJktIPn5uyYUmdTNuyZQvXXnstffv2ZcCAAUyePJlf//rXfPfdd9hsNubOnUv//v1ZvHgx999/P0VFRRQXF3POOefQpUsXFi5cSH19PRMmTGD06NHMmDGjeZbUo48+SufOnbnkkkvYsWMHZWVlPPLII+zcuZMrr7yS/Px8xo4dyzXXXMPll1/O6aefzrhx43jrrbf44x//SF5eHj179uSBBx6guLiYww47jDPOOIOVK1dSXV3NCy+8QK9evVp8nueff56nnnoKrTUTJkzgxhtvbHHur7/+mhkzZrB06VLuuusu7HY77733HkceeSTV1dX84Q9/QGvNMcccwxtvvMHKlSv505/+RF5eHhMmTGDmzJlJf+cSWDLs1VfzmDLFOLlx2dPbOOy06GMtZgjtEmpccC6x7q94B9BjOTYdWneXBadcm7YPTZoTI6WLr9Hnn3/ObbfdxpAhQ5g9ezaDBg3imWeeYfXq1dx000288MIL3HzzzaxcuZLCwkKOPfZYTjjhBD766CPeffddli1bRmlpKb/5zW849dRTOfvss1m6dCn33HMPN9xwAzt27GDJkiV89913lJWVsWjRIs4880wuueQStm3b1qIuVVVV/Pa3v2XZsmXstddePPjgg9x7773cdttteDweDjzwQK6//nruueceXn31VaZPn9587KZNm3j00UdZvnw5BQUFPPPMM3i90VMBPvzwQ15++WX8fj+jR4/mtttu4z//+Q9HHXUUgUCA66+/nhUrVtC5c2cmT57MF198wfDhxns1RSOBJUPee8/KSScZJzc++2wdJ5/so3Gzztxh6gB6GrXuLgudcm2GbPzMHUHPnj0ZMmQIAGvWrGHXrl2sWLECoPnGXFJSQl1dHRaLherq6ubXhw0bRvfu3XG73axZs4Zt27bx/PPPEwgE6Nq1K2VlZdx8883ceOON7LPPPlx55ZVMmTKFJ554gpkzZ3LyySfTp8+eB7Svv/6a8vJy9tqrcQx1/Pjx3HDDDUBjMun48eMB6NGjBzt27GjxOdatW8fRRx9NQUFj78bUqcbLNI4ZM4a8vDzy8vKYNGkSr732GkuXLmXmzJl888031NfXM3nyZABqamrYtGmTBJZcs3athVGjjBON7r3XxcUXd4ykxGQG1WVAPvdkYkwkNI9myJAhTJo0iQsuuIBAIMB///tfAM466ywmT56MzWbjhhtuaE4IbH3sueeey5gxY/B4PKxevRq/30/v3r2ZM2cOd999N//6178YPnw4U6dOxW63M3bsWP797383n2Pfffdl06ZNVFZWUlZWxvLlyxk6dGhMn2PIkCHMmTOH+vp6CgsLWbRoEccffzydOnVi165dACxdujTiZ7/wwgu5+uqrsVgsDBo0iMrKSnr16sXChQspKipi48aNlJYmPwYmgSVNtm5VDBtm3Oq49lo3t9ySmQzpTElmUD2eY7Ox602k38yZM7n66qt58cUXCQQCXHTRRQDs3LkTi8WCzWbjvffeCzt76w9/+ANXXnklc+bMQWvN9ddfT01NDb///e/ZubNxn8MpU6bgdDq59NJL8Xq9HHnkkS3OUVZWxl133cVZZ51FXl4e3bt3Z+7cuTHV/YADDuCyyy5j4sSJ5Ofnc9hhh3H66aczdepUpk2bxksvvcQxxxwT8fjevXtjt9s588wzm+ty0003ceqpp2K1WunWrVvMdYkm5o2+4iUbfTX68UfFoYcWs3t3mC0AQ5xzjpeHHnI1bgWcJdK1sVEym0uZvTGVbHTVVrL/Dqqqqkx5Ck6l2tpaJk2axOLFiyksLOTWW2+lR48eXH311c1l3G53h1zSBfb8DlO20ZeITX09jB9fzLp11qjlRo/28fLLdciKF0JkTlFREUOHDuWcc87BarVSVFTUIqiI+EhgMZnPB+ecU8ibb0bfCri83M/bb9cSx7puIg1ad4sFp1xLd1n7ppTi4YcfznQ12g0JLCbRGq6+2sG8edHX8yoq0qxaVUPXrjndU9hutR7wT2bKtRAdlQQWE9xzj5077zTue/3ssxr22y+396RIhWQG1WVAXojsI4ElCc89l89vfmO88uM779QwYoQElEiSmRYsU4qFyD4SWBLw+ut5nH22cbb83/9ex5gxsW0FLIQQ7YUEljh89JGV4483zpb/y1/qOfNM2QpYiGxy++2389577+HxeBg1ahRLlixh5cqVlJWVAeDz+Tj44IN59913Oe+883C5XDgcDhoaGrj22ms7xKrEZpHAEoMNGywccYTx9K077nAxY0bHyJYXIlGlTTdys1RVVhqWWbduHR988AHLli1DKcXjjz/O+PHjeemll5g2bRoAb7zxBqNGjaJLly4APPbYYwwYMIDKykpGjRrFJ598Ymq927MsSsfLPv/7n6KsrNQwqFxxhYfdu6skqAiRpXr06MHu3bv54IMPAJg2bRpXXnklCxYsaC4zf/58Lr744jbH7tixg7333jttdW0PJLCEUVkJJ544jAMPjL4EyymnePnxxyruvDOx/eWFEOmx11578dJLL7Fo0SImTpzIm2++Sf/+/enatSufffYZO3fu5KeffmLkyJHNx1x22WUMHz6c2bNns3DhwgzWPvdIV1gItxtOOqmIjz+O/rUcfriPf/yjjg66uoMQOal///7cd999/PTTT5xxxhl069aNqVOnMn/+fPr3788FF1zQovxjjz1Gjx49+NWvfsWXX37JEUcckaGa5x4JLIDfDxddVMCrr0bPfejdO8DKlTWY3EUsRIcSy5iI2TZv3sz777/P+eefT5cuXejfvz/ff/89EydO5M4772TDhg288sorbY7r1KkTf/rTn5gyZQpvv/122uudqzp0V5jWcOONDvbaqzRqUFFKs359NWvXSlARIhf16NGDjz/+mFGjRnH88cdTVlbG2LFjsVqtnHTSSRx88MHNe5y0NnjwYAYNGsSiRYvSXOvc1WFXN/7zn23MmmW8FfBHH9UwYEDHTG5M1+rG2Uy+g46xunEsZHVjWd04ooUL87n0UuNs+Sef/JIzzuiZhhoJIUT70mECy7//nceppxpny//1r3VMnOjD6axLQ62EEKL9SSqwKKXOBK4FrMA7WutrTKmViVatsnDsscbJjQ8+WM/550u2vBBCJCvhwXulVD/gDmA8cCjQWyl1ulkVS9Y331goKys1DCo33uimsrJKgooQQpgkmRbLCcArWusqAKXU48BUoO2cvTT6/nvFwQeXUFsbPWNx6lQP990niY1CCGG2hGeFKaVuAmq11g82/TwYeEBrPQFazgpzOp0mVDW6ujoLF1wwmC1bos/0OuaYSu69dxN5HWZ0SYjMcjgcdO3aNdPVEEn4/vvvcbvdzT+Hzgwze1ZYBbBvyM89ml5rI5XT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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10c52deb8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "fig, ax = plt.subplots()\n",
    "ax.scatter(X, y, color='pink', marker='s', label='data set')\n",
    "ax.plot(X, y_pred, color='blue', label='regression curve')\n",
    "ax.plot(X, y_svr_pred, color='red', label='SVR')\n",
    "ax.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "72.14197118147209\n",
      "0.14543531775956597\n",
      "[[1.64398]]\n",
      "[11.13520958]\n"
     ]
    }
   ],
   "source": [
    "print(mean_squared_error(y, y_svr_pred)) # 均方误差 \n",
    "print(r2_score(y, y_svr_pred)) # 决定系数\n",
    "print(model_svr_linear.coef_) # 斜率\n",
    "print(model_svr_linear.intercept_) # 截距"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 超参数的设置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "36.42126375260171\n",
      "0.5685684051071418\n"
     ]
    }
   ],
   "source": [
    "model_svr_rbf = SVR(C=1.0, kernel='rbf')\n",
    "model_svr_rbf.fit(X, y)\n",
    "y_svr_pred = model_svr_rbf.predict(X) \n",
    "print(mean_squared_error(y, y_svr_pred)) # 均方误差\n",
    "print(r2_score(y, y_svr_pred)) # 决定系数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "69.16928620453004\n",
      "-1.4478345530124388\n"
     ]
    }
   ],
   "source": [
    "train_X, test_X = X[:400], X[400:]\n",
    "train_y, test_y = y[:400], y[400:]\n",
    "model_svr_rbf_1 = SVR(C=1.0, kernel='rbf')\n",
    "model_svr_rbf_1.fit(train_X, train_y)\n",
    "test_y_pred = model_svr_rbf_1.predict(test_X) \n",
    "print(mean_squared_error(test_y, test_y_pred)) # 均方误差\n",
    "print(r2_score(test_y, test_y_pred)) # 决定系数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 将数据分为训练数据和验证数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_breast_cancer\n",
    "data = load_breast_cancer()\n",
    "X = data.data\n",
    "y = data.target\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0\n",
      "0.6491228070175439\n"
     ]
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "model_svc = SVC()\n",
    "model_svc.fit(X_train, y_train)\n",
    "y_train_pred = model_svc.predict(X_train)\n",
    "y_test_pred = model_svc.predict(X_test)\n",
    "from sklearn.metrics import accuracy_score\n",
    "print(accuracy_score(y_train, y_train_pred))\n",
    "print(accuracy_score(y_test, y_test_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9974874371859297\n",
      "0.9590643274853801\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "model_rfc = RandomForestClassifier()\n",
    "model_rfc.fit(X_train, y_train)\n",
    "y_train_pred = model_rfc.predict(X_train)\n",
    "y_test_pred = model_rfc.predict(X_test)\n",
    "from sklearn.metrics import accuracy_score\n",
    "print(accuracy_score(y_train, y_train_pred))\n",
    "print(accuracy_score(y_test, y_test_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 交叉验证（cross validation）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.9122807 , 0.96491228, 0.90350877, 0.96491228, 0.96460177])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "from sklearn.model_selection import KFold\n",
    "cv = KFold(5, shuffle=True)\n",
    "model_rfc_1 = RandomForestClassifier()\n",
    "cross_val_score(model_rfc_1, X, y, cv=cv, scoring='accuracy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.95522388, 0.95652174, 0.95945946, 0.96644295, 0.99310345])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross_val_score(model_rfc_1, X, y, cv=cv, scoring=\"f1\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 搜索超参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_breast_cancer\n",
    "data = load_breast_cancer()\n",
    "X = data.data\n",
    "y = 1 - data.target # 反转标签的0和1\n",
    "X = X[:, :10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=KFold(n_splits=5, random_state=None, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',\n",
       "            max_depth=None, max_features='auto', max_leaf_nodes=None,\n",
       "            min_impurity_decrease=0.0, min_impurity_split=None,\n",
       "            min_samples_leaf=1, min_samples_split=2,\n",
       "            min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,\n",
       "            oob_score=False, random_state=None, verbose=0,\n",
       "            warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'max_depth': [5, 10, 15], 'n_estimators': [10, 20, 30]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='accuracy', verbose=0)"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import KFold\n",
    "cv = KFold(5, shuffle=True)\n",
    "param_grid = {'max_depth': [5, 10, 15], 'n_estimators': [10, 20, 30]}\n",
    "model_rfc_2 = RandomForestClassifier()\n",
    "grid_search = GridSearchCV(model_rfc_2, param_grid, cv=cv, scoring='accuracy')\n",
    "grid_search.fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9384885764499121\n",
      "{'max_depth': 5, 'n_estimators': 20}\n"
     ]
    }
   ],
   "source": [
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "grid_search = GridSearchCV(model_rfc_2, param_grid, cv=cv, scoring='f1')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
